"""
作者：chenmanlei
日期：2021年09月08日
"""
###饼图
import matplotlib.pyplot as plt

# 准备数据
data = [0.16881, 0.14966, 0.07471, 0.06992,
        0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]
# 准备标签
labels = ['Java', 'C', 'C++', 'Python',
          'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
          'SQL', 'Assembly langugage', '其他']
# 将第4个语言（Python）分离出来
explode = [0, 0, 0, 0.3, 0, 0, 0, 0, 0, 0, 0]
# 使用自定义颜色
colors = ['red', 'pink', 'magenta', 'purple', 'orange']
# 将横、纵坐标轴标准化处理，保证饼图是一个正圆，否则为椭圆
plt.axes(aspect='equal')
# 控制X轴和Y轴的范围（用于控制饼图的圆心，半径）
plt.xlim(0, 8)
plt.ylim(0, 8)

# 绘制饼图
plt.pie(x=data,  # 绘图数据
        labels=labels,  # 添加编程语言标签
        explode=explode,  # 突出显示Python
        # colors=colors,  # 设置饼图的自定义填充色
        autopct='%.3f%%',  # 设置百分比的格式，此处保留3位小数
        pctdistance=0.8,  # 设置百分比标签与圆心的距离
        labeldistance=1.15,  # 设置标签与圆心的距离
        startangle=180,  # 设置饼图的初始角度
        center=(4, 4),  # 设置饼图的圆心（相当于X轴和Y轴的范围）
        radius=3.8,  # 设置饼图的半径（相当于X轴和Y轴的范围）
        counterclock=False,  # 是否逆时针，这里设置为顺时针方向
        # wedgeprops={'linewidth': 1, 'edgecolor': 'green'},  # 设置饼图内外边界的属性值
        wedgeprops={'linewidth': 1},  # 设置饼图内外边界的属性值
        textprops={'fontsize': 12, 'color': 'black'},  # 设置文本标签的属性值
        frame=1)  # 是否显示饼图的圆圈，此处设为显示
# 不显示X轴和Y轴的刻度值
plt.xticks(())
plt.yticks(())
# 将各轴颜色设为none
plt.gca().spines['bottom'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['left'].set_color('none')
plt.gca().spines['right'].set_color('none')
# 添加图标题
plt.title('2018年8月的编程语言指数排行榜')
# 显示图形
plt.show()



###柱状图
import matplotlib.pyplot as plt
import numpy as np

# 构建数据
x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500, 58300, 56800, 59500, 62700]
# 绘图1——直接绘制会出现重叠
# plt.bar(x=x_data, height=y_data, label='疯狂Java讲义', color='steelblue', alpha=0.8)
# plt.bar(x=x_data, height=y_data2, label='疯狂Android讲义', color='indianred', alpha=0.8)
# 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
# for x, y in enumerate(y_data):
#     plt.text(x, y + 100, '%s' % y, ha='center', va='bottom')
# for x, y in enumerate(y_data2):
#     plt.text(x, y + 100, '%s' % y, ha='center', va='top')
# 绘图2
bar_width = 0.3
# 将X轴数据改为使用range(len(x_data), 就是0、1、2...
plt.bar(x=range(len(x_data)), height=y_data, label='疯狂Java讲义',
        color='steelblue', alpha=0.8, width=bar_width)
# 将X轴数据改为使用np.arange(len(x_data))+bar_width,
# 就是bar_width、1+bar_width、2+bar_width...这样就和第一个柱状图并列了
# plt.bar(x=np.arange(len(x_data))+bar_width, height=y_data2,
#    label='疯狂Android讲义', color='indianred', alpha=0.8, width=bar_width)
plt.bar(x=np.arange(len(x_data)) + bar_width, height=y_data2,
        label='疯狂Android讲义', color='indianred', alpha=0.8, width=bar_width)
# 若希望有缝隙，可以+0.05
# plt.bar(x=np.arange(len(x_data)) + bar_width + 0.05, height=y_data2,
#         label='疯狂Android讲义', color='indianred', alpha=0.8, width=bar_width)
# 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
for x, y in enumerate(y_data):
    plt.text(x, y + 100, '%s' % y, ha='center', va='bottom')
for x, y in enumerate(y_data2):
    plt.text(x + bar_width, y + 100, '%s' % y, ha='center', va='top')
# 为X轴设置刻度值
plt.xticks(np.arange(len(x_data)) + bar_width / 2, x_data)

# 设置标题
plt.title("Java与Android图书对比")
# 为两条坐标轴设置名称
plt.xlabel("年份")
plt.ylabel("销量")
# 显示图例
plt.legend()
plt.show()